home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Collection of Tools & Utilities
/
Collection of Tools and Utilities.iso
/
c
/
recio202.zip
/
rcputf.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-05-05
|
3KB
|
92 lines
/*****************************************************************************
MODULE: rcputf.c
PURPOSE: recio column delimited floating point output functions
COPYRIGHT: (C) 1994 William Pierpoint
COMPILER: Borland C Version 3.1
OS: MSDOS Version 6.2
VERSION: 2.02
RELEASE: May 5, 1994
*****************************************************************************/
#include <float.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "recio.h"
extern int _rstatus(REC *rp, int mode);
extern int _rputc(REC *rp, int ch);
extern char *dtoa(double d, int dig, char *str);
#define rfp(rp) ((rp)->r_fp)
#define rcol(rp) ((rp)->r_colno)
#define rfldch(rp) ((rp)->r_fldch)
/****************************************************************************/
static int /* return error status (0=no error, !0=error) */
_rcputd( /* output flt pt number to col delim stream */
REC *rp, /* pointer to record stream */
size_t begcol, /* field inclusive beginning column */
size_t endcol, /* field inclusive ending column */
int sigdig, /* number of significant digits */
double num) /* floating point number to put to stream */
/****************************************************************************/
{
int err=EOF; /* return error status (0=no error; !0=error) */
size_t sl; /* length of string _r_nsbuf */
int dig; /* significant digits available */
if (!_rstatus(rp, R_WRITE)) {
if (endcol >= begcol && begcol >= rcolno(rp)) {
rfldno(rp)++;
/* if colno < begcol, pad with spaces */
while (rcolno(rp) < begcol) {
err = _rputc(rp, ' ');
if (err) goto done;
}
dig = min(sigdig, (endcol-begcol+1));
while (dig > 0) {
dtoa(num, dig, _r_nsbuf);
sl = strlen(_r_nsbuf);
if (sl <= (endcol-begcol+1)) {
while (rcolno(rp) <= endcol-sl) {
err = _rputc(rp, ' ');
if (err) goto done;
}
err = fputs(_r_nsbuf, rfp(rp));
if (err==EOF) {
rseterr(rp, R_ENOPUT);
} else {
rcol(rp) += sl;
err = 0;
}
goto done;
}
dig -= sl-(endcol-begcol+1);
}
/* converted string too long for space */
rsetwarn(rp, R_WWIDTH);
while (rcolno(rp) <= endcol) {
err = _rputc(rp, '*');
}
} else {
rseterr(rp, R_EINVAL);
}
}
done:
return err;
}
/****************************************************************************/
/* column delimited floating point output functions */
/****************************************************************************/
int rcputf(REC *rp, size_t begcol, size_t endcol, float num)
{
return _rcputd(rp, begcol, endcol, FLT_DIG, (double) num);
}
int rcputd(REC *rp, size_t begcol, size_t endcol, double num)
{
return _rcputd(rp, begcol, endcol, DBL_DIG, num);
}